﻿using Audit.Core;
using Audit.MySql.Providers;

namespace AntDesignProCore.MVC
{
  public class CustomAuditDataProvider : AuditDataProvider
  {
    private readonly MySqlDataProvider _mysqlProvider;

    public CustomAuditDataProvider(string connectionString)
    {
      // 初始化 MySQL 数据提供者
      _mysqlProvider = new MySqlDataProvider(config =>
      {
        config.ConnectionString(connectionString)
            .TableName("t_audit_logs")
            .IdColumnName("id")
            .JsonColumnName("audit_data")
            .CustomColumn("audit_type", ev =>
            {
              // 根据 EventType 判断审计类型
              if (ev.EventType.Contains("/"))
              {
                return "Action";
              }
              else if (ev.EventType.Contains("MariaDBContext"))
              {
                return "EntityFrameworkEvent";
              }
              return "Unknown";
            })
            .CustomColumn("timestamp", ev => DateTime.Now);
      });
    }

    // 重写 InsertEvent 方法来处理事件存储
    public override object InsertEvent(AuditEvent auditEvent)
    {
      // 处理自定义逻辑，可以记录到日志、文件、数据库等
      HandleAuditEvent(auditEvent);

      // 记录到控制台，或者将数据记录到其他地方
      Console.WriteLine($"Intercepted event with EventType: {auditEvent.EventType}");
      Console.WriteLine($"Audit Data: {auditEvent.ToJson()}");

      // 如果需要，可以将事件保存到数据库，或者执行其他操作

      // 调用 MySQL 插入逻辑
      return _mysqlProvider.InsertEvent(auditEvent); // 委托给 MySQLDataProvider

      //return Task.CompletedTask;  // 事件处理完成
    }

    // 重写异步方法
    public override async Task<object> InsertEventAsync(AuditEvent auditEvent, CancellationToken cancellationToken = default)
    {
      // 处理自定义逻辑，可以记录到日志、文件、数据库等
      HandleAuditEvent(auditEvent);

      // 记录到控制台，或者将数据记录到其他地方
      Console.WriteLine($"Intercepted event with EventType: {auditEvent.EventType}");
      Console.WriteLine($"Audit Data: {auditEvent.ToJson()}");

      // 如果需要，可以将事件保存到数据库，或者执行其他操作

      // 调用 MySQL 插入逻辑（异步）
      return await _mysqlProvider.InsertEventAsync(auditEvent, cancellationToken);

      //return Task.CompletedTask;  // 事件处理完成
    }

    private void HandleAuditEvent(AuditEvent auditEvent)
    {
      // 处理事件数据，这里可以记录到日志文件、发送到消息队列等
      Console.WriteLine($"EventType: {auditEvent.EventType}");
      Console.WriteLine($"StartDate: {auditEvent.StartDate}");
    }
  }
}
